/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.folha.controller;

import br.com.folha.dao.DisciplinaDao;
import br.com.folha.dao.GenericoDao;
import br.com.folha.dao.ProfessorDao;
import br.com.folha.entity.Disciplina;
import br.com.folha.entity.Professor;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

/**
 *
 * @author marceloml
 */
@ManagedBean(name="DisciplinaController")
@ViewScoped
public class DisciplinaController implements Serializable{
    
    private static final long serialVersionUID = 1L;
    
    private Disciplina disciplina;
    private Disciplina disciplinaSelecionada;
    private transient DataModel lista;
    private GenericoDao disciplinaDao = new GenericoDao();    
    
    private Professor professor;
    private Map<String,Integer> professores;
    private List<String> selectedProfessores;
    private List<Object> retornoProfessores;
    private ProfessorDao professorDao = new ProfessorDao();

    private String acao;
    private Long resultado;
    private Long resultado2;
    private Date data = new Date();
    private boolean retorno;

    public DisciplinaController(){
        
        disciplina = new Disciplina();
        acao = "";
        
        populaSelectProfessor();
        
    }

    public void preparaInclusao(){
               
        FacesMessage msg = null;
        FacesContext context = FacesContext.getCurrentInstance();
        
        if(disciplina.getNome().equals("")){
                        
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "O nome da disciplina deve ser informado", "");
            context.getCurrentInstance().addMessage(null, msg);
           
        }
        else{
            
            if(!acao.equals("edicao")){
                
                DisciplinaDao consulta = new DisciplinaDao();
                
                resultado = consulta.consultaDisciplinaCodigo(disciplina.getCodigo());
                
                   if(resultado == 0){
                                               
                       resultado2 = consulta.consultaDisciplinaNome(disciplina.getNome());
                    
                       if(resultado2 == 0){
                    
                            salvaOperacao();
                            resetDisciplina();
                            
                       }else{
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Disciplina já cadastrada com este nome!", "");
                        context.getCurrentInstance().addMessage(null, msg);
                       }
                   }else{
                       
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Disciplina já cadastrada com este código!", "");
                        context.getCurrentInstance().addMessage(null, msg);                       
                       
                   }
                                       
            
            }else{
                
                editaDisciplina();
                acao = "";
            }
            
        }        
        
    }
    
    public void salvaOperacao(){
                
        FacesContext context = FacesContext.getCurrentInstance();
            
        FacesMessage msg = null;         
        
        this.disciplina.setDt_cadastro(data);
        
        LoginController usuarioLogado = new LoginController();
                
        this.disciplina.setUsuario_cadastro(usuarioLogado.Usuario.getId());
        
        this.disciplina.setCodigo(disciplina.getCodigo());
                
        this.disciplina.setNome(disciplina.getNome());
        
        Set<Professor> professores = new HashSet<Professor>();
        
        //For utilizado para varrer os itens selecionados no select de Unidades
        for (int i = 0; i < this.selectedProfessores.size(); i++){                         
            
            Integer codigo = Integer.parseInt(this.selectedProfessores.get(i));
            
            Professor professorRetornado = new Professor();            
            professorRetornado = professorDao.getById(codigo);                                  
                        
            professores.add(professorRetornado);            
                                    
            disciplina.setProfessores(professores);
        }        
        
        retorno = disciplinaDao.salvar(this.disciplina);
        
        selectedProfessores.clear();
        lista = new ListDataModel(disciplinaDao.listar(disciplina));
        
        if(retorno){
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Disciplina cadastrada com sucesso!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }else{
            msg = new FacesMessage(FacesMessage.SEVERITY_FATAL, "Falha ao salvar disciplina!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);            
        }
        
    }
    
    public void editaDisciplina(){
        
        FacesMessage msg = null;
        
        disciplina.setDt_atualizacao(data);
        
        LoginController usuarioLogado = new LoginController();
        
        disciplina.setUsuario_atualizacao(usuarioLogado.Usuario.getId());
        
        Set<Professor> professores = new HashSet<Professor>();
        
        //For utilizado para varrer os itens selecionados no select de Unidades
        for (int i = 0; i < this.selectedProfessores.size(); i++){                         
            
            Integer codigo = Integer.parseInt(this.selectedProfessores.get(i));
            
            Professor professorRetornado = new Professor();            
            professorRetornado = professorDao.getById(codigo);                                  
                        
            professores.add(professorRetornado);            
                                    
            disciplina.setProfessores(professores);
        }        
        
        retorno = disciplinaDao.atualizar(disciplina); 
        
        selectedProfessores.clear();
        resetDisciplina();
        
        lista = new ListDataModel(disciplinaDao.listar(disciplina));
        
        if(retorno){           
           
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Disciplina atualizada com sucesso!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);
            
        }          
        
    }    
    
    public void deleteDisciplina(){
        
        FacesMessage msg = null;
        
        if(this.disciplinaSelecionada == null){
            
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Selecione a disciplina a ser deletada!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);             
            
        }else{
        
            disciplinaDao.excluir(this.disciplinaSelecionada);
            lista = new ListDataModel(disciplinaDao.listar(disciplina));
            resetDisciplina();
            selectedProfessores.clear();
            
        }
        
    }
    
    public void populaSelectProfessor(){
        
        professores = new HashMap<String,Integer>(); 
        
        professor = new Professor();                                
               
        retornoProfessores = professorDao.listaProfessorAtivo(Professor.class);        
        
        for (Iterator iterator = retornoProfessores.iterator(); iterator.hasNext();){
            
            Professor professor = (Professor) iterator.next();                     
            
            professores.put(professor.getNome(), professor.getId());                                
        
        }         
        
    }    
    
    public Disciplina preparaEdicao(){
        
        FacesMessage msg = null;
        
        if(this.disciplinaSelecionada == null){
            
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Selecione a disciplina a ser editada!", "");
            FacesContext.getCurrentInstance().addMessage(null, msg);            
            
        }else{      
            
        int contador = 0;
        
        this.selectedProfessores.clear();
        
        for (Iterator iterator = this.disciplinaSelecionada.getProfessores().iterator(); iterator.hasNext();){
            
            Professor professor = (Professor) iterator.next();                                                                 
            
            this.selectedProfessores.add(contador,professor.getId().toString());            
                        
        }            
        
            disciplina = this.disciplinaSelecionada;                        
            
            acao = "edicao";
        
        }
        
      return disciplina;
    }    
    
    public void resetDisciplina(){
        disciplina = new Disciplina();
    }    
    
    public Disciplina getDisciplina() {
        return disciplina;
    }

    public void setDisciplina(Disciplina disciplina) {
        this.disciplina = disciplina;
    }

    public Disciplina getDisciplinaSelecionada() {
        return disciplinaSelecionada;
    }

    public void setDisciplinaSelecionada(Disciplina disciplinaSelecionada) {
        this.disciplinaSelecionada = disciplinaSelecionada;
    }

    public DataModel getLista() {
        if(lista == null || lista.getRowCount() == 0){
        
            lista = new ListDataModel(disciplinaDao.listar(disciplina));
        }
        return lista;
    }

    public Map<String,Integer> getProfessores() {
        return professores;
    }

    public void setProfessores(Map<String,Integer> professores) {
        this.professores = professores;
    }

    public List<String> getSelectedProfessores() {
        return selectedProfessores;
    }

    public void setSelectedProfessores(List<String> selectedProfessores) {
        this.selectedProfessores = selectedProfessores;
    }

    public List<Object> getRetornoProfessores() {
        return retornoProfessores;
    }
    public void setRetornoProfessores(List<Object> retornoProfessores) {
        this.retornoProfessores = retornoProfessores;
    }
    
}
